<script setup>
	import {
		onHide,
		onLaunch,
		onShow
	} from '@dcloudio/uni-app'
	import {
		storeToRefs
	} from 'pinia'
	import {
		useMainStore
	} from '@/store/store'
	const main = useMainStore()
	import {
		isWeixin,
		parseQuery
	} from '@/utils/util'
	import cookie from '@/utils/cookie'
	import {
		userAuthSession,
		wechatAuth,
		alipayMiniAppLogin
	} from '@/api/auth'
	import {
		userGetUserInfo
	} from '@/api/user'
	import {
		APP_ID
	} from '@/config'
	import {
		saveWechatOpenid,
		saveAlipayOpenid
	} from '@/utils/openid'

	onLaunch(() => {
		console.log('App Launch')
		main.restore();
		main.init();
	})

	onShow(() => {
		console.log('App Show')

		// 优先检查token有效性
		checkTokenValidity();
	})

	onHide(() => {
		console.log('App Hide')
	})

	/**
	 * 检查token有效性
	 * 如果token有效，直接使用；如果无效，则进行平台特定的登录流程
	 */
	const checkTokenValidity = async () => {
		console.log('=== 开始检查token有效性 ===');
		
		// 如果没有token，直接进行平台特定登录
		if (!main.token || main.token === '') {
			console.log('未找到token，进行平台特定登录');
			performPlatformSpecificLogin();
			return;
		}

		console.log('发现token，验证有效性:', main.token.substring(0, 20) + '...');

		// 获取当前平台来源
		const from = getCurrentPlatform();
		console.log('当前平台来源:', from);

		try {
			// 调用获取用户信息接口验证token，传递from参数
			const userInfo = await userGetUserInfo({ from: from });
			
			if (userInfo && userInfo.id) {
				console.log('token有效，用户信息已获取:', userInfo.name || userInfo.nickname);
				
				// 更新用户信息到store（可能有变化）
				main.SET_MEMBER(userInfo);
				
				console.log('token验证成功，跳过平台登录流程');
				return;
			} else {
				console.log('token验证失败，用户信息获取异常');
				handleInvalidToken();
			}
		} catch (error) {
			console.error('token验证失败:', error);
			
			// 检查是否是认证相关错误
			if (error.data && error.data.code === 401) {
				console.log('token已过期或无效(401)，清除并重新登录');
				handleInvalidToken();
			} else if (error.toLogin) {
				console.log('token验证失败，需要重新登录');
				handleInvalidToken();
			} else {
				console.log('网络或其他错误，暂时跳过token验证，保留token');
				// 网络错误等情况，不清除token，但仍然进行平台特定登录作为备选
				// 这样可以在网络恢复后继续使用有效的token
				performPlatformSpecificLogin();
			}
		}

		console.log('=== token有效性检查结束 ===');
	}

	/**
	 * 获取当前平台来源
	 */
	const getCurrentPlatform = () => {
		// #ifdef H5
		return 'h5';
		// #endif
		
		// #ifdef MP-WEIXIN
		return 'wechat';
		// #endif
		
		// #ifdef MP-ALIPAY
		return 'alipay';
		// #endif
		
		// #ifdef APP-PLUS
		return 'app';
		// #endif
		
		// 默认返回
		return 'unknown';
	}

	/**
	 * 处理无效token
	 */
	const handleInvalidToken = () => {
		console.log('处理无效token，清除本地数据');
		
		// 清除无效的token和用户信息
		main.SET_TOKEN('');
		main.SET_MEMBER({});
		main.SET_ACCESSES([]);
		
		// 清除本地存储
		uni.removeStorageSync('accessToken');
		uni.removeStorageSync('userinfo');
		uni.removeStorageSync('accesses');
		
		// 清除cookie中的token
		cookie.remove('accessToken');
		cookie.remove('userinfo');
		
		console.log('已清除无效token和用户数据');
		
		// 进行平台特定登录
		performPlatformSpecificLogin();
	}

	/**
	 * 执行平台特定的登录流程
	 */
	const performPlatformSpecificLogin = () => {
		console.log('执行平台特定登录流程');
		
		// 检查用户登录情况
		// #ifdef H5
		if (isWeixin()) {
			// H5编译的代码
			// 判断是否是微信浏览器
		}
		// #endif
		
		// #ifdef MP-WEIXIN
		wechatMiniLogin();
		// #endif
		
		// #ifdef MP-ALIPAY
		alipayMiniLogin();
		// #endif
	}

	const wechatMiniLogin = () => {
		//this.$u.toast('登录中');
		uni.login({
			provider: 'weixin'
		}).then(async (res) => {
			let data = await userAuthSession({
				code: res.code
			});
			if (data) {
				// 使用工具函数保存 openid
				saveWechatOpenid(data);
				console.log('App.vue - 微信 openid 已保存:', data.openId);

				if (data.hasOwnProperty('userInfo') && data.accessToken && data.accessToken != '') {
					main.SET_MEMBER(data.userInfo);
					main.SET_TOKEN(data.accessToken);
					main.SET_ACCESSES(data.accesses);
				}
			}
		});
	}

	/**
	 * 支付宝小程序静默登录
	 * 在应用启动时自动尝试获取用户身份信息（无弹窗）
	 */
	const alipayMiniLogin = async () => {
		console.log('=== App.vue 支付宝小程序静默登录开始 ===');
		
		// 检查是否已经登录
		if (main.isLogin) {
			console.log('用户已登录，跳过静默登录');
			return;
		}

		// 检查 my 对象是否存在
		if (typeof my === 'undefined') {
			console.error('my 对象未定义，可能不在支付宝小程序环境中');
			return;
		}

		console.log('开始支付宝静默获取用户标识...');

		try {
			// 方案1：尝试从本地存储获取已保存的用户标识
			const storedBuyerId = uni.getStorageSync('buyer_id');
			if (storedBuyerId) {
				console.log('App.vue - 发现本地存储的 buyerId:', storedBuyerId);
				
				// 使用已保存的 buyerId 尝试静默登录
				const result = await attemptSilentLoginWithBuyerId(storedBuyerId);
				if (result) {
					return; // 静默登录成功，结束流程
				}
			}

			// 方案2：使用支付宝的静默获取用户信息接口（无弹窗）
			console.log('尝试静默获取支付宝用户信息...');
			
			// 先尝试获取用户基础信息（无需授权）
			const userInfo = await new Promise((resolve) => {
				my.getSystemInfo({
					success: (res) => {
						console.log('App.vue - 获取系统信息成功:', res);
						resolve(res);
					},
					fail: (err) => {
						console.log('App.vue - 获取系统信息失败:', err);
						resolve(null);
					}
				});
			});

			// 方案3：尝试静默获取授权码（仅在必要时）
			// 注意：这里可以先检查是否已经授权过，避免重复弹窗
			await attemptSilentAuth();

		} catch (error) {
			// 静默登录失败不影响应用正常启动，只记录日志
			console.error('App.vue - 支付宝静默登录失败:', error);
			console.error('错误详情:', {
				message: error.message || '未知错误',
				data: error.data || null
			});
		}

		console.log('=== App.vue 支付宝小程序静默登录结束 ===');
	}

	/**
	 * 使用已保存的 buyerId 尝试静默登录
	 */
	const attemptSilentLoginWithBuyerId = async (buyerId) => {
		try {
			console.log('App.vue - 使用本地 buyerId 尝试静默登录...');
			
			// 构造一个模拟的授权结果，直接使用本地 buyerId
			const result = await alipayMiniAppLogin({
				buyerId: buyerId, // 直接传递 buyerId
				silentMode: true  // 标识为静默模式
			});

			console.log('App.vue - 本地 buyerId 登录结果:', result);

			if (result && result.accessToken && result.userInfo) {
				console.log('App.vue - 本地 buyerId 登录成功');
				
				// 保存用户信息到store
				main.SET_MEMBER(result.userInfo);
				main.SET_TOKEN(result.accessToken);
				main.SET_ACCESSES(result.accesses || []);

				console.log('App.vue - 支付宝静默登录完成（使用本地 buyerId）');
				return true;
			}
			
			return false;
		} catch (error) {
			console.log('App.vue - 本地 buyerId 登录失败:', error);
			return false;
		}
	}

	/**
	 * 尝试静默授权（避免不必要的弹窗）
	 */
	const attemptSilentAuth = async () => {
		try {
			// 检查是否已经授权过 auth_user
			const authSetting = await new Promise((resolve) => {
				my.getSetting({
					success: (res) => {
						console.log('App.vue - 获取授权设置:', res);
						resolve(res);
					},
					fail: (err) => {
						console.log('App.vue - 获取授权设置失败:', err);
						resolve(null);
					}
				});
			});

			// 如果已经授权过，则可以静默获取
			if (authSetting && authSetting.authSetting && authSetting.authSetting['scope.userInfo']) {
				console.log('App.vue - 用户已授权，执行静默获取...');
				
				const authResult = await new Promise((resolve, reject) => {
					my.getAuthCode({
						scopes: ['auth_user'],
						success: (res) => {
							console.log('App.vue - 支付宝静默获取授权码成功:', res.authCode);
							resolve(res);
						},
						fail: (err) => {
							console.error('App.vue - 支付宝静默获取授权码失败:', err);
							reject(err);
						}
					});
				});

				// 调用后端接口验证授权码并获取用户信息
				const result = await alipayMiniAppLogin({
					code: authResult.authCode
				});

				console.log('App.vue - 支付宝授权接口返回:', result);

				// 保存 buyerId 作为 openid
				if (result && result.buyerId) {
					saveAlipayOpenid(result);
					console.log('App.vue - 支付宝 buyerId 已保存:', result.buyerId);
				}

				// 如果返回了完整的用户信息和token，说明用户已经注册并登录过
				if (result && result.accessToken && result.userInfo) {
					console.log('App.vue - 检测到已注册用户，自动登录成功');
					
					// 保存用户信息到store
					main.SET_MEMBER(result.userInfo);
					main.SET_TOKEN(result.accessToken);
					main.SET_ACCESSES(result.accesses || []);

					console.log('App.vue - 支付宝静默登录完成，用户信息已保存');
				} else {
					console.log('App.vue - 用户未注册或需要手动登录，已保存 buyerId 供后续使用');
				}
			} else {
				console.log('App.vue - 用户未授权，跳过静默获取，避免弹窗');
				// 不执行任何需要授权的操作，完全静默
			}

		} catch (error) {
			console.log('App.vue - 静默授权检查失败:', error);
		}
	}
</script>

<style lang="scss">
	@import '~@/static/style/app.scss';
	//@import 'static/iconfont/iconfont.scss';
	//@import url('./static/style/style.less');
	@import 'static/style/yshop.css';

	// /*每个页面公共css */
	// page {
	//   background-color: #f5f5f5;
	// }
</style>